#import resturant csv to my computer

data1 <- read.csv("/Users/lin/Desktop/Restaurant.csv")
head(data1)
class(data1$cuisines)
[1] "factor"
a <- as.character(data1$cuisines) 

#I am trying to identity which resturant is vegetarian

library("stringr")
vege <- str_detect(a,"Vegetarian")
data2 <- cbind(vege,data1)

#Filter out the restaurant which is not vegetarian

class(data2$vege)
[1] "logical"
data2$vege <- as.numeric(data2$vege)

#do the subset for vege

library(dplyr)
Registered S3 method overwritten by 'dplyr':
  method           from
  print.rowwise_df     

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
data3 <- subset(data2,vege==1) 

create a new dataset that I convert to lat and lon to the county level

library(dplyr)
data4 <- data3 %>% 
  select(id,city,name,latitude, longitude,phones,paymentTypes,postalCode) %>% 
  na.omit()
View(data4)
library(sp)
library(maps)
library(maptools)
Checking rgeos availability: TRUE
# The single argument to this function, pointsDF, is a data.frame in which:
#   - column 1 contains the longitude in degrees (negative in the US)
#   - column 2 contains the latitude in degrees

latlong2county <- function(pointsDF) {
    # Prepare SpatialPolygons object with one SpatialPolygon
    # per county
    counties <- map('county', fill=TRUE, col="transparent", plot=FALSE)
    IDs <- sapply(strsplit(counties$names, ":"), function(x) x[1])
    counties_sp <- map2SpatialPolygons(counties, IDs=IDs,
                     proj4string=CRS("+proj=longlat +datum=WGS84"))

    # Convert pointsDF to a SpatialPoints object 
    pointsSP <- SpatialPoints(pointsDF, 
                    proj4string=CRS("+proj=longlat +datum=WGS84"))

    # Use 'over' to get _indices_ of the Polygons object containing each point 
    indices <- over(pointsSP, counties_sp)

    # Return the county names of the Polygons object containing each point
    countyNames <- sapply(counties_sp@polygons, function(x) x@ID)
    countyNames[indices]
}

# Test the function using points in Wisconsin and Oregon.
testPoints <- data.frame(x = data4$longitude, y = data4$latitude)

county_list<- latlong2county(testPoints)
county_list_data <- as.data.frame(county_list)
data5 <- cbind(data4,county_list_data) #merge to data4 by adding a column named county_list
data5 <- data5 %>% 
  na.omit()
unique(data5$county_list)
 [1] new york,chautauqua  new york,albany      new york,saratoga   
 [4] new york,rensselaer  new york,washington  new york,ulster     
 [7] new york,warren      new york,westchester new york,kings      
[10] new york,queens      new york,new york    new york,cayuga     
[13] new york,bronx       new york,dutchess    new york,nassau     
[16] new york,ontario     new york,erie        new york,suffolk    
[19] new york,onondaga    new york,columbia    new york,franklin   
[22] new york,monroe      new york,orange      new york,oneida     
[25] new york,essex       new york,otsego      new york,greene     
[28] new york,putnam      new york,niagara     new york,delaware   
[31] new york,rockland    new york,clinton     new york,montgomery 
[34] new york,broome      new york,tompkins    new york,seneca     
[37] new york,sullivan    new york,madison     new york,st lawrence
[40] new york,steuben     new york,chemung     new york,herkimer   
[43] new york,chenango    new york,schenectady new york,hamilton   
[46] new york,livingston  new york,jefferson   new york,tioga      
[49] new york,cortland    new york,yates       new york,fulton     
[52] new york,wayne       new york,schuyler    new york,orleans    
[55] new york,cattaraugus new york,genesee     new york,lewis      
[58] new york,oswego     
58 Levels: new york,albany new york,bronx ... new york,yates

#regular expression for ny vege restaurant data

county_name <- as.character(data5$county_list)
# Remove all before and up to ",":
county_name2 <- gsub(".*,","",county_name)
data6 <- cbind(county_name2,data5)  
data6$county_list <- NULL
data6
unique(data6$county_name2)
 [1] chautauqua  albany      saratoga    rensselaer  washington  ulster     
 [7] warren      westchester kings       queens      new york    cayuga     
[13] bronx       dutchess    nassau      ontario     erie        suffolk    
[19] onondaga    columbia    franklin    monroe      orange      oneida     
[25] essex       otsego      greene      putnam      niagara     delaware   
[31] rockland    clinton     montgomery  broome      tompkins    seneca     
[37] sullivan    madison     st lawrence steuben     chemung     herkimer   
[43] chenango    schenectady hamilton    livingston  jefferson   tioga      
[49] cortland    yates       fulton      wayne       schuyler    orleans    
[55] cattaraugus genesee     lewis       oswego     
58 Levels: albany bronx broome cattaraugus cayuga chautauqua ... yates

#import election data

eleccounty<-read.csv("/Users/lin/Desktop/2016_US_County_Level_Presidential_Results.csv")

eleccounty$X1 <- NULL

eleccounty <- eleccounty %>% 
         filter(state_abbr=="NY") #there are 62 counties in NY State

#do some regular expression on election data

foo <- as.character(eleccounty$county_name)
foo2 <- gsub("\\s*\\w*$", "", foo)
foo3 <- tolower(foo2)
foo4 <- str_replace(foo3, "st. lawrence", "st lawrence")
foo4
 [1] "albany"      "allegany"    "bronx"       "broome"      "cattaraugus"
 [6] "cayuga"      "chautauqua"  "chemung"     "chenango"    "clinton"    
[11] "columbia"    "cortland"    "delaware"    "dutchess"    "erie"       
[16] "essex"       "franklin"    "fulton"      "genesee"     "greene"     
[21] "hamilton"    "herkimer"    "jefferson"   "kings"       "lewis"      
[26] "livingston"  "madison"     "monroe"      "montgomery"  "nassau"     
[31] "new york"    "niagara"     "oneida"      "onondaga"    "ontario"    
[36] "orange"      "orleans"     "oswego"      "otsego"      "putnam"     
[41] "queens"      "rensselaer"  "richmond"    "rockland"    "saratoga"   
[46] "schenectady" "schoharie"   "schuyler"    "seneca"      "st lawrence"
[51] "steuben"     "suffolk"     "sullivan"    "tioga"       "tompkins"   
[56] "ulster"      "warren"      "washington"  "wayne"       "westchester"
[61] "wyoming"     "yates"      

#regular expression of final step for election data

new_eleccounty <- cbind(eleccounty,foo4)

names(new_eleccounty)[names(new_eleccounty) == 'foo4'] <- 'county_name2'

#calculate who is win in 2016 on the county level

new_eleccounty <- new_eleccounty %>% 
  mutate(difference_in_vote=votes_gop-votes_dem) %>% 
  mutate (R.D= ifelse(difference_in_vote > 0, "Republican", "Democrat"))

#combine cleaned ny vege reastaurant with election county data in 2016

#left outer join
df <- left_join(data6, new_eleccounty,by = "county_name2")
Column `county_name2` joining factors with different levels, coercing to character vector
df$paymentTypes <- as.character(df$paymentTypes)
df$paymentTypes[df$paymentTypes==""] <- "NA"
df$paymentTypes <- as.factor(df$paymentTypes)

#make a leaflet map of vege restaurant in NY States

library(leaflet)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(RColorBrewer)

pal = colorFactor(palette = c("blue", "red"), domain = df$R.D) # Grab a palette
color_vote = pal(df$R.D)

content <- paste("ID:",df$id,"<br/>",
                 "County:",df$county_name,"<br/>",
                 "Restaurant Name:",df$name,"<br/>",
                 "Phones:",df$phones,"<br/>",
                 "PaymentType:",df$paymentTypes,"<br/>",
                 "PostCode",df$postalCode,"<br/>"
                 )
                

leaflet(df) %>%
  addProviderTiles("Stamen.TonerLite") %>% 
  # Using the Provider Name
  addCircles(color=color_vote,
             lng = ~longitude, 
             lat = ~latitude,
             popup = content,
             fillOpacity = 1,
             stroke=FALSE) %>% 
  addLegend(pal = pal, values = ~df$R.D, title = "Won Party in 2016") %>% 
  addCircleMarkers(clusterOptions = markerClusterOptions())
Assuming "longitude" and "latitude" are longitude and latitude, respectively

#make another graph (not useful, feel free to ignore it!)

as.character(df$county_name)
#install.packages("urbnmapr")
library(urbnmapr)
# Returns a ggplot2 object with a geom_map of the the lower 
# 48 states (plus Hawaii & Alaska reset on the bottom) 
uscounties_sf <- get_urbn_map("counties", 
                              sf = TRUE)

str(uscounties_sf)
Classes ‘sf’ and 'data.frame':  3142 obs. of  7 variables:
 $ county_fips: chr  "04015" "12035" "20129" "28093" ...
 $ state_abbv : chr  "AZ" "FL" "KS" "MS" ...
 $ state_fips : chr  "04" "12" "20" "28" ...
 $ county_name: chr  "Mohave County" "Flagler County" "Morton County" "Marshall County" ...
 $ fips_class : chr  "H1" "H1" "H1" "H1" ...
 $ state_name : chr  "Arizona" "Florida" "Kansas" "Mississippi" ...
 $ geometry   :sfc_MULTIPOLYGON of length 3142; first list element: List of 1
  ..$ :List of 1
  .. ..$ : num [1:1023, 1:2] -1321573 -1321334 -1320642 -1319546 -1317819 ...
  ..- attr(*, "class")= chr  "XY" "MULTIPOLYGON" "sfg"
 - attr(*, "sf_column")= chr "geometry"
 - attr(*, "agr")= Factor w/ 3 levels "constant","aggregate",..: NA NA NA NA NA NA
  ..- attr(*, "names")= chr  "county_fips" "state_abbv" "state_fips" "county_name" ...
counties <- counties %>% 
  filter(state_abbv=="NY")
counties
library(ggthemes)
elec_data <- inner_join(df, counties, by ="county_name")
Column `county_name` joining factor and character vector, coercing into character vector
#county_name" = "county_name")
winstatesmap <- ggplot(elec_data, 
    aes(x = long, y = lat, group=group)) + 
    geom_polygon(aes(fill = R.D), color="white")+
    scale_fill_manual(values = c("steel blue","firebrick"))+
    theme_map() + 
    coord_map(projection = "mercator")
winstatesmap

LS0tCnRpdGxlOiAibWFwX3Jlc3RhdXJhbnQiCmF1dGhvcjogIkxpbiBaaGFvIgpkYXRlOiAiNC8xNi8yMDIwIgpvdXRwdXQ6IAogaHRtbF9ub3RlYm9vazoKICAgIGRlZmF1bHQKIGh0bWxfZG9jdW1lbnQ6CiAgICBkZWZhdWx0Ci0tLQoKI2ltcG9ydCByZXN0dXJhbnQgY3N2IHRvIG15IGNvbXB1dGVyCmBgYHtyfQpkYXRhMSA8LSByZWFkLmNzdigiL1VzZXJzL2xpbi9EZXNrdG9wL1Jlc3RhdXJhbnQuY3N2IikKaGVhZChkYXRhMSkKYGBgCgoKYGBge3J9CmNsYXNzKGRhdGExJGN1aXNpbmVzKQpgYGAKCmBgYHtyfQphIDwtIGFzLmNoYXJhY3RlcihkYXRhMSRjdWlzaW5lcykgCmBgYAoKI0kgYW0gdHJ5aW5nIHRvIGlkZW50aXR5IHdoaWNoIHJlc3R1cmFudCBpcyB2ZWdldGFyaWFuIApgYGB7cn0KbGlicmFyeSgic3RyaW5nciIpCnZlZ2UgPC0gc3RyX2RldGVjdChhLCJWZWdldGFyaWFuIikKZGF0YTIgPC0gY2JpbmQodmVnZSxkYXRhMSkKYGBgCgoKI0ZpbHRlciBvdXQgdGhlIHJlc3RhdXJhbnQgd2hpY2ggaXMgbm90IHZlZ2V0YXJpYW4KCmBgYHtyfQpjbGFzcyhkYXRhMiR2ZWdlKQpkYXRhMiR2ZWdlIDwtIGFzLm51bWVyaWMoZGF0YTIkdmVnZSkKYGBgCgoKI2RvIHRoZSBzdWJzZXQgZm9yIHZlZ2UKYGBge3J9CmxpYnJhcnkoZHBseXIpCmRhdGEzIDwtIHN1YnNldChkYXRhMix2ZWdlPT0xKSAKYGBgCgoKCiMjIGNyZWF0ZSBhIG5ldyBkYXRhc2V0IHRoYXQgSSBjb252ZXJ0IHRvIGxhdCBhbmQgbG9uIHRvIHRoZSBjb3VudHkgbGV2ZWwKYGBge3J9CmxpYnJhcnkoZHBseXIpCmRhdGE0IDwtIGRhdGEzICU+JSAKICBzZWxlY3QoaWQsY2l0eSxuYW1lLGxhdGl0dWRlLCBsb25naXR1ZGUscGhvbmVzLHBheW1lbnRUeXBlcyxwb3N0YWxDb2RlKSAlPiUgCiAgbmEub21pdCgpClZpZXcoZGF0YTQpCmBgYAoKCgpgYGB7cn0KbGlicmFyeShzcCkKbGlicmFyeShtYXBzKQpsaWJyYXJ5KG1hcHRvb2xzKQoKIyBUaGUgc2luZ2xlIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24sIHBvaW50c0RGLCBpcyBhIGRhdGEuZnJhbWUgaW4gd2hpY2g6CiMgICAtIGNvbHVtbiAxIGNvbnRhaW5zIHRoZSBsb25naXR1ZGUgaW4gZGVncmVlcyAobmVnYXRpdmUgaW4gdGhlIFVTKQojICAgLSBjb2x1bW4gMiBjb250YWlucyB0aGUgbGF0aXR1ZGUgaW4gZGVncmVlcwoKbGF0bG9uZzJjb3VudHkgPC0gZnVuY3Rpb24ocG9pbnRzREYpIHsKICAgICMgUHJlcGFyZSBTcGF0aWFsUG9seWdvbnMgb2JqZWN0IHdpdGggb25lIFNwYXRpYWxQb2x5Z29uCiAgICAjIHBlciBjb3VudHkKICAgIGNvdW50aWVzIDwtIG1hcCgnY291bnR5JywgZmlsbD1UUlVFLCBjb2w9InRyYW5zcGFyZW50IiwgcGxvdD1GQUxTRSkKICAgIElEcyA8LSBzYXBwbHkoc3Ryc3BsaXQoY291bnRpZXMkbmFtZXMsICI6IiksIGZ1bmN0aW9uKHgpIHhbMV0pCiAgICBjb3VudGllc19zcCA8LSBtYXAyU3BhdGlhbFBvbHlnb25zKGNvdW50aWVzLCBJRHM9SURzLAogICAgICAgICAgICAgICAgICAgICBwcm9qNHN0cmluZz1DUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCgogICAgIyBDb252ZXJ0IHBvaW50c0RGIHRvIGEgU3BhdGlhbFBvaW50cyBvYmplY3QgCiAgICBwb2ludHNTUCA8LSBTcGF0aWFsUG9pbnRzKHBvaW50c0RGLCAKICAgICAgICAgICAgICAgICAgICBwcm9qNHN0cmluZz1DUlMoIitwcm9qPWxvbmdsYXQgK2RhdHVtPVdHUzg0IikpCgogICAgIyBVc2UgJ292ZXInIHRvIGdldCBfaW5kaWNlc18gb2YgdGhlIFBvbHlnb25zIG9iamVjdCBjb250YWluaW5nIGVhY2ggcG9pbnQgCiAgICBpbmRpY2VzIDwtIG92ZXIocG9pbnRzU1AsIGNvdW50aWVzX3NwKQoKICAgICMgUmV0dXJuIHRoZSBjb3VudHkgbmFtZXMgb2YgdGhlIFBvbHlnb25zIG9iamVjdCBjb250YWluaW5nIGVhY2ggcG9pbnQKICAgIGNvdW50eU5hbWVzIDwtIHNhcHBseShjb3VudGllc19zcEBwb2x5Z29ucywgZnVuY3Rpb24oeCkgeEBJRCkKICAgIGNvdW50eU5hbWVzW2luZGljZXNdCn0KCiMgVGVzdCB0aGUgZnVuY3Rpb24gdXNpbmcgcG9pbnRzIGluIFdpc2NvbnNpbiBhbmQgT3JlZ29uLgp0ZXN0UG9pbnRzIDwtIGRhdGEuZnJhbWUoeCA9IGRhdGE0JGxvbmdpdHVkZSwgeSA9IGRhdGE0JGxhdGl0dWRlKQoKY291bnR5X2xpc3Q8LSBsYXRsb25nMmNvdW50eSh0ZXN0UG9pbnRzKQpgYGAKCgpgYGB7cn0KY291bnR5X2xpc3RfZGF0YSA8LSBhcy5kYXRhLmZyYW1lKGNvdW50eV9saXN0KQpkYXRhNSA8LSBjYmluZChkYXRhNCxjb3VudHlfbGlzdF9kYXRhKSAjbWVyZ2UgdG8gZGF0YTQgYnkgYWRkaW5nIGEgY29sdW1uIG5hbWVkIGNvdW50eV9saXN0CmBgYAoKCgpgYGB7cn0KZGF0YTUgPC0gZGF0YTUgJT4lIAogIG5hLm9taXQoKQp1bmlxdWUoZGF0YTUkY291bnR5X2xpc3QpCmBgYAoKCiNyZWd1bGFyIGV4cHJlc3Npb24gZm9yIG55IHZlZ2UgcmVzdGF1cmFudCBkYXRhCmBgYHtyfQpjb3VudHlfbmFtZSA8LSBhcy5jaGFyYWN0ZXIoZGF0YTUkY291bnR5X2xpc3QpCiMgUmVtb3ZlIGFsbCBiZWZvcmUgYW5kIHVwIHRvICIsIjoKY291bnR5X25hbWUyIDwtIGdzdWIoIi4qLCIsIiIsY291bnR5X25hbWUpCmRhdGE2IDwtIGNiaW5kKGNvdW50eV9uYW1lMixkYXRhNSkgIApkYXRhNiRjb3VudHlfbGlzdCA8LSBOVUxMCmRhdGE2CmBgYAoKCmBgYHtyfQp1bmlxdWUoZGF0YTYkY291bnR5X25hbWUyKQpgYGAKCgojaW1wb3J0IGVsZWN0aW9uIGRhdGEgCmBgYHtyfQplbGVjY291bnR5PC1yZWFkLmNzdigiL1VzZXJzL2xpbi9EZXNrdG9wLzIwMTZfVVNfQ291bnR5X0xldmVsX1ByZXNpZGVudGlhbF9SZXN1bHRzLmNzdiIpCgplbGVjY291bnR5JFgxIDwtIE5VTEwKCmVsZWNjb3VudHkgPC0gZWxlY2NvdW50eSAlPiUgCiAgICAgICAgIGZpbHRlcihzdGF0ZV9hYmJyPT0iTlkiKSAjdGhlcmUgYXJlIDYyIGNvdW50aWVzIGluIE5ZIFN0YXRlCgpgYGAKCiNkbyBzb21lIHJlZ3VsYXIgZXhwcmVzc2lvbiBvbiBlbGVjdGlvbiBkYXRhCgpgYGB7cn0KZm9vIDwtIGFzLmNoYXJhY3RlcihlbGVjY291bnR5JGNvdW50eV9uYW1lKQpgYGAKCgpgYGB7cn0KZm9vMiA8LSBnc3ViKCJcXHMqXFx3KiQiLCAiIiwgZm9vKQpmb28zIDwtIHRvbG93ZXIoZm9vMikKZm9vNCA8LSBzdHJfcmVwbGFjZShmb28zLCAic3QuIGxhd3JlbmNlIiwgInN0IGxhd3JlbmNlIikKZm9vNApgYGAKCiNyZWd1bGFyIGV4cHJlc3Npb24gb2YgZmluYWwgc3RlcCBmb3IgZWxlY3Rpb24gZGF0YQpgYGB7cn0KbmV3X2VsZWNjb3VudHkgPC0gY2JpbmQoZWxlY2NvdW50eSxmb280KQoKbmFtZXMobmV3X2VsZWNjb3VudHkpW25hbWVzKG5ld19lbGVjY291bnR5KSA9PSAnZm9vNCddIDwtICdjb3VudHlfbmFtZTInCmBgYAoKCiNjYWxjdWxhdGUgd2hvIGlzIHdpbiBpbiAyMDE2IG9uIHRoZSBjb3VudHkgbGV2ZWwKYGBge3J9Cm5ld19lbGVjY291bnR5IDwtIG5ld19lbGVjY291bnR5ICU+JSAKICBtdXRhdGUoZGlmZmVyZW5jZV9pbl92b3RlPXZvdGVzX2dvcC12b3Rlc19kZW0pICU+JSAKICBtdXRhdGUgKFIuRD0gaWZlbHNlKGRpZmZlcmVuY2VfaW5fdm90ZSA+IDAsICJSZXB1YmxpY2FuIiwgIkRlbW9jcmF0IikpCmBgYCAKCgojY29tYmluZSBjbGVhbmVkIG55IHZlZ2UgcmVhc3RhdXJhbnQgd2l0aCBlbGVjdGlvbiBjb3VudHkgZGF0YSBpbiAyMDE2CgpgYGB7cn0KI2xlZnQgb3V0ZXIgam9pbgpkZiA8LSBsZWZ0X2pvaW4oZGF0YTYsIG5ld19lbGVjY291bnR5LGJ5ID0gImNvdW50eV9uYW1lMiIpCgpkZiRwYXltZW50VHlwZXMgPC0gYXMuY2hhcmFjdGVyKGRmJHBheW1lbnRUeXBlcykKZGYkcGF5bWVudFR5cGVzW2RmJHBheW1lbnRUeXBlcz09IiJdIDwtICJOQSIKZGYkcGF5bWVudFR5cGVzIDwtIGFzLmZhY3RvcihkZiRwYXltZW50VHlwZXMpCmBgYAoKCgojbWFrZSBhIGxlYWZsZXQgbWFwIG9mIHZlZ2UgcmVzdGF1cmFudCBpbiBOWSBTdGF0ZXMKYGBge3J9CmxpYnJhcnkobGVhZmxldCkKCmxpYnJhcnkoUkNvbG9yQnJld2VyKQoKcGFsID0gY29sb3JGYWN0b3IocGFsZXR0ZSA9IGMoImJsdWUiLCAicmVkIiksIGRvbWFpbiA9IGRmJFIuRCkgIyBHcmFiIGEgcGFsZXR0ZQpjb2xvcl92b3RlID0gcGFsKGRmJFIuRCkKCmNvbnRlbnQgPC0gcGFzdGUoIklEOiIsZGYkaWQsIjxici8+IiwKICAgICAgICAgICAgICAgICAiQ291bnR5OiIsZGYkY291bnR5X25hbWUsIjxici8+IiwKICAgICAgICAgICAgICAgICAiUmVzdGF1cmFudCBOYW1lOiIsZGYkbmFtZSwiPGJyLz4iLAogICAgICAgICAgICAgICAgICJQaG9uZXM6IixkZiRwaG9uZXMsIjxici8+IiwKICAgICAgICAgICAgICAgICAiUGF5bWVudFR5cGU6IixkZiRwYXltZW50VHlwZXMsIjxici8+IiwKICAgICAgICAgICAgICAgICAiUG9zdENvZGUiLGRmJHBvc3RhbENvZGUsIjxici8+IgogICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIAoKbGVhZmxldChkZikgJT4lCiAgYWRkUHJvdmlkZXJUaWxlcygiU3RhbWVuLlRvbmVyTGl0ZSIpICU+JSAKICAjIFVzaW5nIHRoZSBQcm92aWRlciBOYW1lCiAgYWRkQ2lyY2xlcyhjb2xvcj1jb2xvcl92b3RlLAogICAgICAgICAgICAgbG5nID0gfmxvbmdpdHVkZSwgCiAgICAgICAgICAgICBsYXQgPSB+bGF0aXR1ZGUsCiAgICAgICAgICAgICBwb3B1cCA9IGNvbnRlbnQsCiAgICAgICAgICAgICBmaWxsT3BhY2l0eSA9IDEsCiAgICAgICAgICAgICBzdHJva2U9RkFMU0UpICU+JSAKICBhZGRMZWdlbmQocGFsID0gcGFsLCB2YWx1ZXMgPSB+ZGYkUi5ELCB0aXRsZSA9ICJXb24gUGFydHkgaW4gMjAxNiIpICU+JSAKICBhZGRDaXJjbGVNYXJrZXJzKGNsdXN0ZXJPcHRpb25zID0gbWFya2VyQ2x1c3Rlck9wdGlvbnMoKSkKCmBgYAoKCgoKCiNtYWtlIGFub3RoZXIgZ3JhcGggKG5vdCB1c2VmdWwsIGZlZWwgZnJlZSB0byBpZ25vcmUgaXQhKQoKYGBge3J9CmFzLmNoYXJhY3RlcihkZiRjb3VudHlfbmFtZSkKYGBgCgoKYGBge3J9CiNpbnN0YWxsLnBhY2thZ2VzKCJ1cmJubWFwciIpCmxpYnJhcnkodXJibm1hcHIpCiMgUmV0dXJucyBhIGdncGxvdDIgb2JqZWN0IHdpdGggYSBnZW9tX21hcCBvZiB0aGUgdGhlIGxvd2VyIAojIDQ4IHN0YXRlcyAocGx1cyBIYXdhaWkgJiBBbGFza2EgcmVzZXQgb24gdGhlIGJvdHRvbSkgCnVzY291bnRpZXNfc2YgPC0gZ2V0X3VyYm5fbWFwKCJjb3VudGllcyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZiA9IFRSVUUpCgpzdHIodXNjb3VudGllc19zZikKYGBgCgoKYGBge3J9CmNvdW50aWVzIDwtIGNvdW50aWVzICU+JSAKICBmaWx0ZXIoc3RhdGVfYWJidj09Ik5ZIikKY291bnRpZXMKYGBgCgoKYGBge3J9CmxpYnJhcnkoZ2d0aGVtZXMpCmVsZWNfZGF0YSA8LSBpbm5lcl9qb2luKGRmLCBjb3VudGllcywgYnkgPSJjb3VudHlfbmFtZSIpCmBgYAoKCgoKYGBge3J9CndpbnN0YXRlc21hcCA8LSBnZ3Bsb3QoZWxlY19kYXRhLCAKICAgIGFlcyh4ID0gbG9uZywgeSA9IGxhdCwgZ3JvdXA9Z3JvdXApKSArIAogICAgZ2VvbV9wb2x5Z29uKGFlcyhmaWxsID0gUi5EKSwgY29sb3I9IndoaXRlIikrCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCJzdGVlbCBibHVlIiwiZmlyZWJyaWNrIikpKwogICAgdGhlbWVfbWFwKCkgKyAKICAgIGNvb3JkX21hcChwcm9qZWN0aW9uID0gIm1lcmNhdG9yIikKd2luc3RhdGVzbWFwCmBgYAoKCgoKCgo=